﻿#ifndef CDATABASEOPERMGR_PRIVATE_H
#define CDATABASEOPERMGR_PRIVATE_H

#include <QMap>
#include <QReadWriteLock>
#include <QSqlDatabase>
#include <QSqlError>
#include <QEventLoop>
#include <QMutex>
#include <QDebug>

#include "cdatabaseopermgr.h"

#include "cdbbaseoper.h"
#include "publiclog.h"
#include "cdbtableinfomgr.h"
//#include "publicdefine.h"

/***********************************************
* [className]   CDatabaseOperMgrPrivate
* [func]        数据库管理数据类
* [author]      jhb
* [date]        2023-12-06 09:31
* [Modification Log]
* Version               By              Notes
* v0.0.1                jhb             初次建立
************************************************/
class CDatabaseOperMgrPrivate
{
    CDatabaseOperMgr *q_ptr;
    Q_DECLARE_PUBLIC(CDatabaseOperMgr)
public:
    CDatabaseOperMgrPrivate();
    virtual ~CDatabaseOperMgrPrivate();
    //设置数据库读写连接数
    bool setConnectNumber(const quint8 &nReadNum, const quint8 &nWriteNum);
    //设置数据库连接信息
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg);
    //设置数据库连接信息及库表名集合
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, QVector<QString> vecTableName);
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, QStringList listTableName);
    bool setDbConfigInfo(const CDataBaseConfig &stDbCfg, QVector<CDbTableInfo> vecTableInfo);
    //开启数据库连接
    bool open();
    //断开数据库连接
    void close();
    //判断数据库连接是否打开
    bool isOpen();
    //开启事务
    bool transaction(const QString &strId, int nType);
    //提交事务
    bool commit(const QString &strId);
    //回滚事务
    bool rollback(const QString &strId);
    //获取数据库操作信息指针
    CDbTableDataInfo *getDbDataInfo(const int &nTable, const int nType);
    CDbTableDataInfo *getDbDataInfo(const QString &strTable, const int nType);
    //获取执行结果
    bool getResult(const int &nTable, const int &nLock);
    bool getResult(const QString &strTable, const int &nLock);
    //写日志
    void writeLog(const QString &sLogText, int nType, const QString &sFl);
    //获取模块名
    QString getModuleName(const int &nType);

    //重连处理
    bool reconnect(QMap<QMutex*, CDbBaseOper*> mapDb);
    bool reconnect(QVector<CDbBaseOper*> vecDb);
    //事务连接绑定
    bool connectTransaction(const QString &strId, QMap<QMutex*, CDbBaseOper*> mapDb);
    bool connectTransaction(const QString &strId, QVector<CDbBaseOper*> vecDb);
    //执行语句
    bool execRead(CDbTableInfoMgr *pMgr);
    bool execWrite(CDbTableInfoMgr *pMgr);
    //事务执行
    bool execTransactionRead(CDbTableInfoMgr *pMgr);
    bool execTransactionWrite(CDbTableInfoMgr *pMgr);
    //锁列表内添加写锁表
    void AppendTableName(const QString &sTableName);
    //锁列表内移除写锁表
    void RemoveTableName(const QString &sTableName);
    //获取数据
    bool getSqlData(CDbBaseOper *pDb, CDbTableInfoMgr *pMgr);
    //初始化Sql数据
    bool initSqlData(CDbBaseOper *pDb, CDbTableInfoMgr *pMgr);

public:
    bool                            m_bIsOpen;              //是否成功调到Open接口打开数据库
    bool                            m_bIsSetNumber;         //是否调用成功SetConnectNumber接口标识
    quint8                          m_nReadNumber;          //读数据库连接数量
    quint8                          m_nWriteNumber;         //写数据库连接数量
    QVector<CDbBaseOper*>           m_vecReadDbOper;        //读连接
    QVector<CDbBaseOper*>           m_vecWriteDbOper;       //写连接
    QList<QString>                  m_listTableName;        //正在写表名列表
    QReadWriteLock                  m_lockTableName;        //表名读写锁
    CDataBaseConfig                 m_stDbCfg;              //数据库连接信息
    CLogBase                        *m_pLog;                //日志组件指针
    QVector<CDbTableInfoMgr*>       m_vecDbDataInfo;        //数据库表信息（执行SQL数据与表关联）
    QMap<QString, CDbBaseOper*>     m_mapTransID;           //ID与Sql事务绑定连接
    QMap<CDbBaseOper*, QString>     m_mapTransSql;          //Sql事务与ID绑定连接
    DbOpenDoneCallback              m_pDbOpenDoneCb;        //数据库打开成功回调
};


#endif // CDATABASEOPERMGR_PRIVATE_H
